#ifndef GRAYVALUEMEASUREMENTALGORITHM_H
#define GRAYVALUEMEASUREMENTALGORITHM_H

#include "MeasurementAlgorithmBase.h"
#include "GrayValueMeasurementResultWidget.h"
#include "GrayValueMeasurementDrawerFactory.h"
#include <QImage>
#include <QPoint>
#include <QFlags>
#include <memory>

/**
 * @brief 灰度值测量算法类
 * 实现图像中指定点的灰度值测量功能，支持单点/多点灰度值获取
 */
class GrayValueMeasurementAlgorithm : public MeasurementAlgorithmBase {
    Q_OBJECT
    Q_INTERFACES(MeasurementAlgorithmBase)
    Q_PLUGIN_METADATA(IID MEASUREMENTALGORITHMBASE_IID)
public:
    explicit GrayValueMeasurementAlgorithm(QObject *parent = nullptr);
    ~GrayValueMeasurementAlgorithm() override;
    
    /**
     * @brief 开始测量
     * 初始化测量环境，准备进行测量操作
     * @param imageId 图像唯一标识符
     */
    void startMeasurement(const QString &imageId) override;

    /**
     * @brief 结束测量
     * 清理测量资源，结束当前测量任务
     */
    void endMeasurement() override;

    /**
     * @brief 设置测量参数
     * @param params 测量参数集合
     */
    void setMeasurementParameters(const QVariantMap &params) override;

    /**
     * @brief 获取当前处理的图像ID
     * @return 图像ID
     */
    QString currentImageId() const override;

    /**
     * @brief 获取算法名称
     * @return 算法名称
     */
    QString algorithmName() const override;

    /**
     * @brief 初始化算法和结果显示界面
     * 创建结果显示窗口并连接信号和槽
     */
    void initialize() override;

    /**
     * @brief 获取测量参数
     * @return 包含测量参数的QVariantMap
     */
    QVariantMap getMeasurementParameters() const override;

    /**
     * @brief 获取算法支持的测量模式
     */
    MeasurementModes getSupportedModes() const override;

    /**
     * @brief 设置测量结果（用于撤销/重做操作）
     * @param measurementResult 测量结果
     */
    void setMeasurementResult(const QVariantMap &measurementResult) override;
    
    /**
     * @brief 设置缩放比例
     * @param scale 缩放比例值
     */
    void setScale(double scale) override;
    
    /**
     * @brief 设置单位转换信息
     * @param xUnit X轴单位
     * @param yUnit Y轴单位
     * @param lengthRatio 长度转换比例
     * @param timeRatio 时间转换比例
     * @param wavelengthRatio 波长转换比例
     * @param lengthUnit 长度单位
     * @param timeUnit 时间单位
     * @param wavelengthUnit 波长单位
     */
    void setUnitConversionInfo(int xUnit, int yUnit, double lengthRatio,
                              double timeRatio, double wavelengthRatio, const QString &lengthUnit,
                              const QString &timeUnit, const QString &wavelengthUnit) override;

private:

    /**
     * @brief 从参数中提取并绘制测量图形
     * @param params 测量参数集合
     */
    void drawMeasurementGraphics(const QVariantMap &params);

public slots:
    /**
     * @brief 处理矩形区域变化
     * @param rect 变化后的矩形区域（图像坐标）
     */
    void onRectangleChanged(const QRectF &rect);
    
    /**
     * @brief 处理线条变化
     * @param lineImage 线条对象（图像坐标）
     */
    void onLineChanged(const QLineF &lineImage);

private:
    GrayValueMeasurementResultWidget *m_resultWidget; // 结果显示窗口
    std::unique_ptr<GrayValueMeasurementDrawerFactory> m_drawerFactory; // 绘制器工厂

};

#endif // GRAYVALUEMEASUREMENTALGORITHM_H
